<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

/**
 * Class para Upload de imagem
 *
 * @author Douglas Rafael
 */
class UploadImage extends CI_Model {
    
    public function __construct() {
       parent::__construct();
    }
    
    /**
     * Faz o Upload da imagem. Apenas upload da imagem original ou também é criado o thumb
     * 
     * @param string $path            Caminho para mover o upload
     * @param string $name_file       Nome do arquivo tanto da imagem como da thumb
     * @param int    $width           Largura da imagem para o resize
     * @param int    $height          Altura da imagem  para o resize
     * @param int    $thumb           TRUE se deseja criar o thumb - TRUE é o valor default
     * @param int    $width_thumb     Largura da imagem thumb (miniatua)
     * @param int    $height_thumb    Altura da imagem thumb (miniatua)
     * @param bool   $maintain_ratio  Manter proporção no redimencionar. FALSE é o valor padrão
     * @return array                  Dados da imagem que foi feito o upload
     * @throws Exception            
     */
    public function do_upload($path, $name_file = NULL, $width = 450, $height = 660, $thumb = TRUE, $width_thumb = 160, $height_thumb = 230, $maintain_ratio = FALSE) {
        try {
            $config = array();
            $config['allowed_types'] = 'jpg|jpeg|png';
            $config['upload_path'] = $path;
            $config['max_size'] = 1024; // 1MB in KB
            $config['remove_spaces'] = TRUE; // preg_replace("/\s+/", "_", $string);
            $name_file != NULL ? $config['file_name'] = $name_file : ''; //Seta o nome da imagem caso exista

            $this->load->library('upload', $config);
            
            if (!$this->upload->do_upload('imagem')) {
                throw new Exception($this->upload->display_errors());
            } else {
                $image_data = $this->upload->data();
                
                /**
                 * Redimensionada imagem original
                 */
                $this->load->library('image_lib');
                
                $config['source_image'] = $image_data['full_path'];
                $config['create_thumb'] = FALSE;
                $config['maintain_ratio'] = $maintain_ratio;
                $config['width'] = $width;
                $config['height'] = $height;

                $this->image_lib->initialize($config);

                if (!$this->image_lib->resize()) {
                    throw new Exception($this->image_lib->display_errors());
                } else {
                    $this->image_lib->clear();
                    // Se for solicitado a criação de thumb. O padrão é TRUE
                    $thumb ? $this->create_thumbnail($path, $image_data['full_path'], $width_thumb, $height_thumb) : '';
                }
            }
            return $image_data;
            
        } catch (Exception $e) {
            throw new Exception('<p><strong>Ocorreu um erro ao tentar fazer upload da imagem:</strong></p>' . $e->getMessage());
        }
    }

    
    /**
     * Cria thumb
     * 
     * @param  string  $path   Caminho para mover o upload
     * @param  string  $image  Full Patch da imagem, caminho da imagem que será usada para fazer a copia
     * @param  int     $width  Largura da imagem para o resize. Útil para criar Thumb
     * @param  int     $height Altura da Imagem
     * @throws Exception
     */
    private function create_thumbnail($path, $image, $width, $height) {
        try {
            $dir = $path . 'thumb/';
            if(!is_dir($dir)) {
                mkdir($dir, 0777);
                copy($path . 'index.html', $dir . 'index.html');
                copy($path . 'no-image.jpg', $dir . 'no-image.jpg');
            }
            $this->load->library('image_lib');
            
            $config_thumb['source_image'] = $image;
            $config_thumb['new_image'] = $dir;
            $config_thumb['maintain_ratio'] = FALSE;
            $config_thumb['create_thumb'] = FALSE;
            $config_thumb['width'] = $width;
            $config_thumb['height'] = $height;
            $this->image_lib->initialize($config_thumb);

            if (!$this->image_lib->resize()) {
                throw new Exception('<p>' . $this->image_lib->display_errors() . '</p>');
            }
            
        } catch (Exception $e) {
            throw new Exception($e->getMessage());
        }
    }
    
    
    /**
     * Remove imagens do diretorio passado por parametro
     * - Remove também o thumb
     * 
     * @param string $dir       Diretório
     * @param string $name_file Nome do arquivo
     * @throws Exception
     */
    public function delete_image($dir, $name_file) {
        try {
            if (is_dir($dir) && file_exists($dir . $name_file) && $name_file != 'no-image.jpg' && $name_file != NULL) { //Verifica se existe
                if (unlink($dir . $name_file)) { // remove caso exista
                    if (is_dir($dir . 'thumb/') && file_exists($dir . 'thumb/' . $name_file)) { //Verifica se existe
                        if (!unlink($dir . 'thumb/' . $name_file)) { // remove caso exista
                            throw new Exception("Ocorreu um erro ao tentar excluir imagem.");
                        }
                    }
                } else {
                    throw new Exception();
                }
            }
        } catch (Exception $e) {
            throw new Exception($e->getMessage());
        }
    }
}
